package ar.edu.utn.frsf.tpae.a2014.g03.persistence.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import ar.edu.utn.frsf.tpae.a2014.g03.enums.EstadoPedidoEnum;

@Entity
@Table(name = "ped")
public class Pedido extends TpaeEntity<Integer> {

	private static final long serialVersionUID = 721996721632048000L;

	public static final String TRANSPORTISTA = "transportista";

	private Cliente cliente;
	private Administrativo administrativo;
	private Transportista transportista;
	private String descripcionProd;
	private Double pesoProd;
	private Double volumenProd;
	private String direccionOrigen;
	private String direccionDestino;
	private List<HistorialPedido> historial = new ArrayList<HistorialPedido>();

	@Id
	@Column(name = "ped_id")
	@SequenceGenerator(name = "SecuenciaPedido", sequenceName = "seq_ped", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SecuenciaPedido")
	public Integer getId() {
		return id;
	}

	@ManyToOne
	@JoinColumn(name = "ped_cli_id")
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	@ManyToOne
	@JoinColumn(name = "ped_adm_id")
	public Administrativo getAdministrativo() {
		return administrativo;
	}

	public void setAdministrativo(Administrativo administrativo) {
		this.administrativo = administrativo;
	}

	@ManyToOne
	@JoinColumn(name = "ped_tra_id")
	public Transportista getTransportista() {
		return transportista;
	}

	public void setTransportista(Transportista transportista) {
		this.transportista = transportista;
	}

	@Column(name = "ped_dsc")
	public String getDescripcionProd() {
		return descripcionProd;
	}

	public void setDescripcionProd(String descripcionProd) {
		this.descripcionProd = descripcionProd;
	}

	@Column(name = "ped_pso")
	public Double getPesoProd() {
		return pesoProd;
	}

	public void setPesoProd(Double pesoProd) {
		this.pesoProd = pesoProd;
	}

	@Column(name = "ped_vol")
	public Double getVolumenProd() {
		return volumenProd;
	}

	public void setVolumenProd(Double volumenProd) {
		this.volumenProd = volumenProd;
	}

	@Column(name = "ped_dir_org")
	public String getDireccionOrigen() {
		return direccionOrigen;
	}

	public void setDireccionOrigen(String direccionOrigen) {
		this.direccionOrigen = direccionOrigen;
	}

	@Column(name = "ped_dir_dst")
	public String getDireccionDestino() {
		return direccionDestino;
	}

	public void setDireccionDestino(String direccionDestino) {
		this.direccionDestino = direccionDestino;
	}

	@OneToMany(fetch = FetchType.EAGER)
	@Cascade(value = CascadeType.ALL)
	@JoinColumn(name = "his_ped_id")
	public List<HistorialPedido> getHistorial() {
		return historial;
	}

	public void setHistorial(List<HistorialPedido> historial) {
		this.historial = historial;
	}

	public void addHistorial(HistorialPedido historialPedido) {
		this.historial.add(historialPedido);
	}

	@Override
	public boolean equals(Object obj) {
		boolean equals = true;
		if (obj == null) {
			equals = false;
		} else if (this == obj) {
			equals = true;
		} else if (!(obj instanceof Pedido)) {
			equals = false;
		} else {
			equals = this.id.equals(((Pedido) obj).getId());
		}
		return equals;
	}

	@Transient
	public String getEstado() {
		String estado = "";
		if (!historial.isEmpty()) {
			Iterator<HistorialPedido> histIterator = historial.iterator();
			HistorialPedido his = histIterator.next();
			Date fechaRegistro = his.getFechaCambio();
			estado = his.getEstado().toString();
			for (HistorialPedido hisPedidos:this.historial) {
				if (hisPedidos.getFechaCambio().after(fechaRegistro)) {
					estado = hisPedidos.getEstado().getDescripcion();
				}
			}
		}
		return estado;
	}
	
	@Transient
	public Date getFechaAlta(){
		Date fechaAlta=null;
		for (HistorialPedido hist:this.historial) {
			if (hist.getEstado().equals(EstadoPedidoEnum.ACEPTADO)) {
				fechaAlta=hist.getFechaCambio();
				break;
			}
		}
		return fechaAlta;
	}
	
	@Transient
	public Date getFechaEntrega(){
		Date fechaEntrega=null;
		for (HistorialPedido hist:this.historial) {
			if (hist.getEstado().equals(EstadoPedidoEnum.ENTREGADO)) {
				fechaEntrega=hist.getFechaRegistraCambio();
				break;
			}
		}
		return fechaEntrega;
	}
}
